﻿

#include "zyStatusBar.h"

DarkMoonUI::zyStatusBar::zyStatusBar()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setChildWndProc(zyStatusBar_ChildWndProc);

}
DarkMoonUI::zyStatusBar::~zyStatusBar()
{

}
LRESULT WINAPI DarkMoonUI::zyStatusBar::zyStatusBar_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle)
{
	if (message == WM_NOTIFY) {
		NMHDR* nm = reinterpret_cast<NMHDR*>(lParam);
		if (nm->code == NM_CLICK) {
			NMMOUSE* mouseNM = reinterpret_cast<NMMOUSE*>(lParam);
			TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnClick"));
			if (evtPtr != nullptr) {
				evtPtr->handler<int>(nm->hwndFrom, mouseNM->dwItemSpec, mouseNM->pt.x, mouseNM->pt.y);
				*bHandle = true;
				return 1;
			}
		}
		else if (nm->code == NM_DBLCLK) {
			NMMOUSE* mouseNM = reinterpret_cast<NMMOUSE*>(lParam);
			TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnDBLClick"));
			if (evtPtr != nullptr) {
				evtPtr->handler<int>(nm->hwndFrom, mouseNM->dwItemSpec, mouseNM->pt.x, mouseNM->pt.y);
				*bHandle = true;
				return 1;
			}
		}
		else if (nm->code == NM_RCLICK) {
			NMMOUSE* mouseNM = reinterpret_cast<NMMOUSE*>(lParam);
			TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnRClick"));
			if (evtPtr != nullptr) {
				evtPtr->handler<int>(nm->hwndFrom, mouseNM->dwItemSpec, mouseNM->pt.x, mouseNM->pt.y);
				*bHandle = true;
				return 1;
			}
		}
		else if (nm->code == SBN_SIMPLEMODECHANGE) {
			TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnSimpleModeChange"));
			if (evtPtr != nullptr) {
				evtPtr->handler<int>(nm->hwndFrom);
			}
		}
	}
	return zyCtrol::zyCtrol_ChildWndProc(obj, hWnd, message, wParam, lParam, bHandle);
}

BOOL DarkMoonUI::zyStatusBar::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_窗口风格 == 0)
		参数_窗口风格 = SBARS_SIZEGRIP | CCS_BOTTOM | CCS_NOMOVEY | SBARS_TOOLTIPS ;
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();

	return _CreateCtrol(参数_父窗口, 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 , 参数_扩展风格, L"msctls_statusbar32");
}

BOOL DarkMoonUI::zyStatusBar::创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_窗口风格 == 0)
		参数_窗口风格 = SBARS_SIZEGRIP | CCS_BOTTOM | CCS_NOMOVEY | SBARS_TOOLTIPS;
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();

	return _CreateCtrol(参数_父窗口.getHwnd(), 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 , 参数_扩展风格, L"msctls_statusbar32");

}

int DarkMoonUI::zyStatusBar::加入栏目(const std::wstring& 参数_栏目文本, int 参数_宽度, const std::wstring& 参数_动态提示文本, zyIcon* 参数_图标)
{
	//将指定栏目加入到状态条中，返回加入后该项目所处的位置。注意：没有加入任何栏目之前，状态栏默认就有一个宽度为-1的栏目。建议使用 分割栏目（）方法
	std::vector<int> 局部_栏目数组;
	if (参数_宽度 == NULL)
		参数_宽度 = 50;
	int 局部_栏目数 = (int)sendMsg(SB_GETPARTS, 0, 0);  // 取栏目数
	if (局部_栏目数 == 0)
		return -1;
	局部_栏目数组.resize(局部_栏目数);

	if (sendMsg(SB_GETPARTS, 局部_栏目数, reinterpret_cast<LPARAM>(&局部_栏目数组[0])) == 0)
		return -1;
	if (局部_栏目数 == 1 && 局部_栏目数组.empty()) {  // 默认栏目宽度为-1
		if (参数_宽度 != -1)
			局部_栏目数组[局部_栏目数 - 1] = 参数_宽度;
		else
			局部_栏目数组[局部_栏目数 - 1] = 100;
	}
	if (参数_宽度 == -1)
		局部_栏目数组.push_back(参数_宽度);
	else
		局部_栏目数组.push_back(局部_栏目数组.back() + 参数_宽度);
	if (sendMsg(SB_SETPARTS, 局部_栏目数组.size(), reinterpret_cast<LPARAM>(&局部_栏目数组[0])) == 0)
		return -1;
	if (!参数_栏目文本.empty())
		sendMsg(SB_SETTEXTW, 局部_栏目数, reinterpret_cast<LPARAM>(参数_栏目文本.c_str()));
	if (!参数_动态提示文本.empty())
		sendMsg(SB_SETTIPTEXTW, 局部_栏目数, reinterpret_cast<LPARAM>(参数_动态提示文本.c_str()));
	if (参数_图标->getIcon() != 0) {
		HICON hIcon = CopyIcon((HICON)参数_图标->getIcon());
		sendMsg(SB_SETICON, 局部_栏目数, reinterpret_cast<LPARAM>(hIcon));
	}
	return 局部_栏目数;
}
bool DarkMoonUI::zyStatusBar::删除栏目(int 参数_栏目索引) {//删除指定的栏目。
	std::vector<int> 局部_栏目数组;
	int 局部_栏目数 = (int)sendMsg(SB_GETPARTS, 0, 0);  // 取栏目数
	if (局部_栏目数 == 0 || 参数_栏目索引 < 0 || 参数_栏目索引 >= 局部_栏目数)
		return false;
	局部_栏目数组.resize(局部_栏目数);
	if (sendMsg(SB_GETPARTS, 局部_栏目数, reinterpret_cast<LPARAM>(&局部_栏目数组[0])) == 0)
		return false;
	局部_栏目数组.erase(局部_栏目数组.begin() + 参数_栏目索引 + 1);
	return sendMsg(SB_SETPARTS, 局部_栏目数组.size(), reinterpret_cast<LPARAM>(&局部_栏目数组[0])) != 0;
}
bool DarkMoonUI::zyStatusBar::分割栏目(std::vector<int>& 参数_分割栏宽度) {//重新分割状态栏。
	std::vector<int> 局部_临时数组;
	int 局部_临时位置 = 0;
	int 局部_成员数 = (int)参数_分割栏宽度.size();
	局部_临时数组.resize(局部_成员数);
	for (int 局部_计次 = 0; 局部_计次 < 局部_成员数; 局部_计次++) {
		if (参数_分割栏宽度[局部_计次] == -1)
			局部_临时数组[局部_计次] = 参数_分割栏宽度[局部_计次];
		else
			局部_临时数组[局部_计次] = 参数_分割栏宽度[局部_计次] + 局部_临时位置;
		局部_临时位置 = 局部_临时位置 + 参数_分割栏宽度[局部_计次];
	}
	return sendMsg(SB_SETPARTS, 局部_成员数, reinterpret_cast<LPARAM>(&局部_临时数组[0])) != 0;
}
int DarkMoonUI::zyStatusBar::取分割栏目(std::vector<int>& 参数_分割栏位置) {
	std::vector<int> 局部_临时数组;
	int 局部_临时位置 = 0;
	int 局部_栏目数 = (int)sendMsg(SB_GETPARTS, 0, 0);  // 取栏目数
	局部_临时数组.resize(局部_栏目数);
	sendMsg(SB_GETPARTS, 局部_栏目数, reinterpret_cast<LPARAM>(&局部_临时数组[0]));
	参数_分割栏位置.resize(局部_栏目数);
	for (int 局部_计次 = 0; 局部_计次 <= 局部_栏目数; 局部_计次++) {
		if (局部_临时数组[局部_计次] == -1)
			参数_分割栏位置[局部_计次] = 局部_临时数组[局部_计次];
		else
			参数_分割栏位置[局部_计次] = 局部_临时数组[局部_计次] - 局部_临时位置;
		局部_临时位置 = 局部_临时位置 + 参数_分割栏位置[局部_计次];
	}
	return 局部_栏目数;
}
RECT DarkMoonUI::zyStatusBar::取栏目矩形(int 参数_栏目索引) {
	RECT rc = { 0 };
	sendMsg(SB_GETRECT, 参数_栏目索引, (LPARAM)&rc);
	return rc;
}
bool DarkMoonUI::zyStatusBar::置栏目文本(int 参数_栏目索引, const std::wstring& 参数_栏目文本) {
	return sendMsg(SB_SETTEXTW, 参数_栏目索引, (LPARAM)参数_栏目文本.c_str()) != 0;
}
std::wstring DarkMoonUI::zyStatusBar::取栏目文本(int 参数_栏目索引) {
    // 检查索引有效性
    if (参数_栏目索引 < 0 || 参数_栏目索引 >= SB_GETPARTS) {
        return L"";
    }

    // 获取文本长度并检查返回值
    int 文本长度 = static_cast<int>(sendMsg(SB_GETTEXTLENGTHW, 参数_栏目索引, 0));
    if (文本长度 == -1) {
        return L"";
    }

    // 分配足够空间存储文本
    std::wstring 局部_文本变量;
    if (文本长度 > 0) {
        局部_文本变量.resize(文本长度 + 1); // +1 for null terminator
        if (sendMsg(SB_GETTEXTW, 参数_栏目索引, reinterpret_cast<LPARAM>(&局部_文本变量[0])) == 0) {
            return L"";
        }
    }

    return 局部_文本变量;
}
int DarkMoonUI::zyStatusBar::置栏目图标(int 参数_栏目索引, zyIcon& 参数_图标) {//成功返回真，失败返回假
	HICON hIcon = (HICON)sendMsg(SB_GETICON, 参数_栏目索引, 0);
	if (hIcon != 0)
		DestroyIcon(hIcon);
	hIcon = CopyIcon(参数_图标.getIcon());
	return (int)sendMsg(SB_SETICON, 参数_栏目索引, (LPARAM)hIcon) != 0;
}
DarkMoonUI::zyIcon DarkMoonUI::zyStatusBar::取栏目图标(int 参数_栏目索引) {
	zyIcon ico;
	ico.setIcon(CopyIcon((HICON)sendMsg(SB_GETICON, 参数_栏目索引, 0)));
	return ico;
}
bool DarkMoonUI::zyStatusBar::置动态提示文本(int 参数_栏目索引, const std::wstring& 参数_提示文本) {
	//std::wcout << L"提示：" << (sendMsg(SB_SETTIPTEXT, 参数_栏目索引, (LPARAM)L"这是提示文本") != 0) << std::endl;
	return sendMsg(SB_SETTIPTEXTW, 参数_栏目索引, (LPARAM)参数_提示文本.c_str()) != 0;
}
std::wstring DarkMoonUI::zyStatusBar::取动态提示文本(int 参数_栏目索引) {
    // 验证参数_栏目索引是否在有效范围内
    if (参数_栏目索引 < 0 || 参数_栏目索引 >= SB_GETPARTS) {
        return L"";
    }

    std::wstring 局部_文本变量(MAX_PATH, L'\0');
    int ret = (int)sendMsg(SB_GETTIPTEXTW, MAKEWPARAM(参数_栏目索引, MAX_PATH), (LPARAM)&局部_文本变量[0]);

    // 检查 sendMsg 的返回值
    if (ret <= 0) {
        return L"";
    }

    // 找到实际的字符串长度，并截断多余的空字符
    size_t length = wcslen(&局部_文本变量[0]);
    return 局部_文本变量.substr(0, length);
}
bool DarkMoonUI::zyStatusBar::置简单模式(bool 参数_是否简单模式) {
	return sendMsg(SB_SIMPLE, 参数_是否简单模式 ? 1 : 0, 0) != 0;
}
bool DarkMoonUI::zyStatusBar::取边界(std::vector<int>& 参数_边界集) {
	参数_边界集.resize(3);
	return sendMsg(SB_GETBORDERS, 0, reinterpret_cast<LPARAM>(&参数_边界集[0])) != 0;
}